package com.crm.system.service.contactManager;

import com.alibaba.fastjson.JSONObject;
import com.crm.common.model.DhPageInfo;
import com.crm.model.entity.contactManager.Contact;
import com.crm.model.entity.systemManager.SysParameterSetting;
import com.crm.model.qo.cluePoolManager.ClueFollowQO;
import com.crm.model.qo.contactManager.ContactFollowPlanTimeQO;
import com.crm.model.qo.contactManager.ContactQO;
import com.crm.model.vo.contactManager.*;
import com.crm.model.vo.customerManager.CustomerContactVO;
import com.crm.model.vo.customerManager.FzCustomerContactVO;
import com.crm.model.vo.systemManager.CardImportVO;
import com.crm.model.vo.systemManager.ContactImportVO;

import java.text.ParseException;
import java.util.Date;
import java.util.List;

/**
 * 联系人管理信息
 */
public interface ContactService {

    /**
     * 管理模块 -- 客户列表
     * @param pageIndex 页码
     * @param pageSize 分页大小
     * @param contactQO 查询条件
     * @param sortName 排序列名字
     * @param sortOrder 排序规则(asc/desc)
     * @return
     */
    DhPageInfo<ContactVO> selectContactVOList(Integer pageIndex, Integer pageSize, ContactQO contactQO, String sortName, String sortOrder);

    /**
     * 联系人-新增联系人  联系人大表和客户下联系人同时新增
     * @param customerContactVO 联系人实体类
     * @return
     */
    String addContact(CustomerContactVO customerContactVO);

    /**
     * 联系人-新增联系人--同一客户下联系人去重
     * @param customerId 客户id
     * @param contactName 联系人姓名
     * @param contactInformation 联系方式
     * @param contactNature 联系人性质  0企业联系人  1个人联系人
     * @return
     */
    Contact getCustomerIdAndContactNameAndAccountId(String customerId, String contactName,String contactInformation,String contactNature,String csd);

    /**
     * 联系人-删除  逻辑删除
     * @param contactId 联系人id
     * @return
     */
    Boolean deleteContact(String contactId);


    /**
     * 通过联系人id查询联系人信息--mybatis查询
     * @param contactId 联系人id
     * @return
     */
    Contact selectContactById(String contactId);


    /**
     * 通过联系人id查询联系人详细信息
     * @param contactId 联系人id
     * @return
     */
    ContactVO selectContactDetailById(String contactId);

    /**
     * 联系人-联系人详情-修改联系人详情
     * @param contactId 联系人id
     * @param name 图片  修改联系人评分  标签
     * @param bs 1 上传图片  2修改联系人评分  3标签
     * @return
     */
    Boolean updateContact(String contactId,String name,String bs);


    /**
     * 商机-新增商机-通过客户id查询联系人列表
     * @param customerId 客户id
     * @return
     */
    List<Contact> contactByCustomerIdList(String customerId);

    /**
     * 联系人-新增联系人--同一客户下联系人重名-->合并联系方式
     * @param customerId 客户id
     * @param contactName 联系人姓名
     * @param contactNature  联系人性质  0企业联系人  1非企业联系人
     * @return
     */
    List<Contact> getContactName(String customerId, String contactName, String contactNature);

    /**
     *联系人详情--联系方式 开启/废止联系方式
     * @param fzCustomerContactVO contactInformationId数组 联系方式id
     * @param fzCustomerContactVO abolishState 废止状态  1启动 2废止
     * @return
     */
    Boolean updateAbolishStateById(FzCustomerContactVO fzCustomerContactVO);

    /**
     * 联系人-新增联系人--同一客户下联系方式不能一样
     * @param customerId 客户id
     * @param contactInformation 联系方式
     * @param contactNature  联系人性质  0企业联系人  1非企业联系人
     * @return
     */
    List<ContactInformationVO> getCustomerIdAndContactInformation(String customerId, String contactInformation, String contactNature);

    /**
     * 联系人-客户详情-联系人列表-跳转联系人详情
     * @param customerId 客户id
     * @param contactInformation 联系方式
     * @param contactName  联系人姓名
     * @return
     */
    Contact getContactId(String customerId, String contactInformation, String contactName);

    /**
     * 商机-新增商机-过客户id查询联系人列表  分页
     * @param pageIndex 页码
     * @param pageSize 分页大小
     * @param sortName 排序列名字
     * @param sortOrder 排序规则
     * @param customerId 客户id
     * @return
     */
    DhPageInfo<Contact> pageContactByCustomerIdList(Integer pageIndex, Integer pageSize, String sortName, String sortOrder, String customerId);

    /**
     * @author wll
     * info 联系人管理-联系人列表-跟进
     * @param clueFollowQO 跟进参数
     * @return
     */
    Boolean addContactFollow(ClueFollowQO clueFollowQO);

    /**
     * 查询联系人里面有的行业,地图
     * @param bs 0管理端 1用户端
     * @param type industry行业 province地区
     * @return
     */
    List<IndustryAreaVO> selectIndustry(String bs,String type);

    /**
     * 联系人列表-设置为常用联系人
     * @param contactId 联系人id
     * @param topContact 常用联系人  0常用  1不常用
     * @return
     */
    Boolean setUpTopContact(String contactId, Integer topContact);

    /**
     * 根据客户id查询联系人信息
     * @param pageIndex 页码
     * @param pageSize 分页大小
     * @param sortName 排序列名字
     * @param sortOrder 排序规则(asc/desc)
     * @param customerId 客户id
     * @return
     */
    DhPageInfo<Contact> contactByCustIdList(Integer pageIndex, Integer pageSize, String sortName, String sortOrder, String customerId);



    /**
     * @Description: 联系人报表折线图
     * @Param: [dateType]
     * @Return: com.crm.model.vo.contactManager.ContactReportLineVO
     * @Author: lixq-f
     * @Date: 2021/4/16
    **/
    ContactReportLineVO getContactReportLine(Integer dateType, String bs);


    /**
     * 联系人报表-列表
     * @param pageIndex
     * @param pageSize
     * @param sortName
     * @param sortOrder
     * @param dateType
     * @return
     */
    DhPageInfo<ContactReportListVO> getContactReportList(Integer pageIndex, Integer pageSize, String sortName,
                                                         String sortOrder, Integer dateType);

    /**
     * 呼叫中心根据手机号和账号Id查询联系人
     * @Author pym
     * @Date  2021/6/11 15:33
     * @param contactInformation 联系方式
     * @param accountId 账号Id
     * @return {@link {com.crm.model.entity.contactManager.Contact}}
     */
    Contact getContactByContactInfoAndId(String contactInformation, String accountId);

    /**
     * 导入联系人信息
     * @param list  联系人信息集合
     * @param companyId 分公司id
     * @return
     */
    JSONObject importContact(List<ContactImportVO> list, String companyId) throws ParseException;

    /***
     * @Description: 根据联系人id查询联系人信息
     * @Param: 联系人id
     * @Author: luojie
     * @Date: 2021/6/28 14:37
     */
    List<ContactMyVO> selectMyContactsByContactId(String contactId);

    /***
     * @Description: 根据客户id查询联系人信息
     * @Param: 客户id
     * @Author: luojie
     * @Date: 2021/6/28 14:37
     */
    List<ContactMyVO> selectCustomerContacts(String customerId);

    /**
     * 联系人大表数据加入客户联系人下
     * @return
     */
    int comparisonData();

    /**
     * 联系人大表去重
     * @return
     */
    int updateRepeatData();

    /**
     * 客户下联系人表去重
     * @return
     */
    int updateRepeatDatas();

    /**
     * 联系人-联系人详情-修改联系人详情  家庭住址,公司地址,微信,邮箱
     * @param contact 联系人信息
     * @return
     */
    Boolean updateContactDetail(Contact contact);

    /**
     * 展示兑换码列表
     * @param pageIndex 页码
     * @param pageSize 条数
     * @param sortName 分组名称
     * @param sortOrder 分组类型
     * @param contactId 联系人id
     * @return
     */
    DhPageInfo<ContactExchangeCodeVO> selectContactExchangeCodeList(Integer pageIndex, Integer pageSize, String sortName, String sortOrder, String contactId);

    /**
     * 开启关闭联系人发码
     * 联系人发码状态  0发码 1不发码
     * @return
     */
    Boolean updateContactcodeStatus(Integer contactcodeStatus);

    /**
     * 联系人发码
     * @param contactInformation 手机号
     * @param accountId 用户id
     * @param contactId 联系人id
     * @param bs 0个人客户传过来的   1其他入口
     */
    String contactSendCode(String contactInformation,String accountId,String contactId,String bs);

    /**
     * 查询系统设置表
     * @return
     */
    SysParameterSetting selectParameterSetting();

    /**
     * 会员卡数据补全
     */
    void cardDataCompletion() throws ParseException;

    /**
     * 查询多出来的会员卡
     * @return
     */
    void cardDataMany();

    /**
     * crm会员卡跟本系统会员卡比对
     * @param list
     * @return
     */
    JSONObject importCard(List<CardImportVO> list);

    void cardDataManys(List<CardImportVO> list);

    /**
     * 会员卡数据所有人添加
     * @return
     */
    void cardAccount();

    /**
     * 判断该客户下是否有此联系电话
     * @Author renshaorong
     * @Date 2021/10/21 
     * @param customerId
     * @param contactPhone
     * @return true：有，false：没有
     */
    boolean checkExist(String customerId, String contactPhone);

    /**
     * 查询联系人里面有的标签
     * @param bs 0管理端 1用户端
     * @return
     */
    List<String> selectTag(String bs);

    /**
     * 联系人列表--废止联系人 开启/废止联系方式    废止联系人,联系方式,客户下联系人
     * @param fzCustomerContactVO abolishState 废止状态  1启动 2废止
     * @return
     */
    Boolean updateContactAbolishState(FzCustomerContactVO fzCustomerContactVO);

    /**
     * 新增跟进计划时间
     * @param qo
     * @return
     */
    Boolean addContactFollowPlanTimes(ContactFollowPlanTimeQO qo);

    /**
     * 修改跟进计划时间
     */
    void updateContactFollowPlanTime();

    /**
     * 修改联系人意向状态
     * @param contactId 联系人id
     * @param currentIntention 目前意向   0有意向 1无意向
     * @return
     */
    Boolean updateContactCurrentIntention(String contactId, String currentIntention);

    /**
     * 移除计划
     * @param contactId 联系人id
     * @return
     */
    Boolean updateFollowPlanTime(String contactId);
}
